package com.newshub.logging.implementation.logback;

import com.newshub.logging.core.LogStorage;
import com.newshub.logging.core.SystemLogger;
import com.newshub.logging.context.LogContext;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

/**
 * Logback日志实现
 */
@Slf4j
@Component
public class LogbackLogger implements SystemLogger {
    
    @Autowired
    private LogStorage logStorage;
    
    @Override
    public void info(String message, LogContext context) {
        // 构建详细的日志消息
        String detailedMessage = buildDetailedMessage(message, context);
        
        // 使用SLF4J记录到控制台
        log.info(detailedMessage);
        
        // 同时存储到文件
        logStorage.store(context, message, "INFO");
    }
    
    @Override
    public void warn(String message, LogContext context) {
        // 构建详细的日志消息
        String detailedMessage = buildDetailedMessage(message, context);
        
        // 使用SLF4J记录到控制台
        log.warn(detailedMessage);
        
        // 同时存储到文件
        logStorage.store(context, message, "WARN");
    }
    
    @Override
    public void error(String message, LogContext context, Throwable exception) {
        // 构建详细的日志消息
        String detailedMessage = buildDetailedMessage(message, context);
        
        // 使用SLF4J记录到控制台
        log.error(detailedMessage, exception);
        
        // 同时存储到文件
        logStorage.store(context, message, "ERROR");
    }
    
    @Override
    public void debug(String message, LogContext context) {
        // 构建详细的日志消息
        String detailedMessage = buildDetailedMessage(message, context);
        
        // 使用SLF4J记录到控制台
        log.debug(detailedMessage);
        
        // 同时存储到文件
        logStorage.store(context, message, "DEBUG");
    }
    
    @Override
    public void performance(String message, LogContext context) {
        // 构建详细的日志消息
        String detailedMessage = "PERFORMANCE - " + buildDetailedMessage(message, context);
        
        // 使用SLF4J记录到控制台
        log.info(detailedMessage);
        
        // 同时存储到文件
        logStorage.store(context, message, "PERFORMANCE");
    }
    
    @Override
    public void security(String message, LogContext context) {
        // 构建详细的日志消息
        String detailedMessage = "SECURITY - " + buildDetailedMessage(message, context);
        
        // 使用SLF4J记录到控制台
        log.warn(detailedMessage);
        
        // 同时存储到文件
        logStorage.store(context, message, "SECURITY");
    }
    
    /**
     * 构建详细的日志消息
     */
    private String buildDetailedMessage(String message, LogContext context) {
        StringBuilder sb = new StringBuilder();
        
        // 模块名称
        if (context.getModule() != null && !context.getModule().trim().isEmpty()) {
            sb.append("[").append(context.getModule()).append("] ");
        }
        
        // 操作描述
        if (context.getDescription() != null && !context.getDescription().trim().isEmpty()) {
            sb.append(context.getDescription()).append(" - ");
        }
        
        // 消息内容
        sb.append(message);
        
        // 方法信息
        if (context.getMethodName() != null) {
            sb.append(" | 方法: ").append(context.getClassName()).append(".").append(context.getMethodName());
        }
        
        // 执行时间
        if (context.getExecutionTime() != null) {
            sb.append(" | 耗时: ").append(context.getExecutionTime()).append("ms");
        }
        
        // 请求ID
        if (context.getRequestId() != null) {
            sb.append(" | 请求ID: ").append(context.getRequestId());
        }
        
        return sb.toString();
    }
}
